home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
wais
/
ui
/
screen-ui.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-09
|
51KB
|
1,935 lines
/* WIDE AREA INFORMATION SERVER SOFTWARE:
No guarantees or restrictions. See the readme file for the full standard
disclaimer.
*/
/* This is a simple screen user interface for making WAIS queries
* It is the strange offspring of waisq and curses..
*
* Revision 1.2 initial version by jcurran@nnsc.nsf.net
* (dedicated to Suzi, Alex, et. al.)
*
* Revision 1.5 changes 12/91 by datta@cs.uwp.edu
*
* added page up/down 'J/K'
* screen state now returns to normal after piping commands
* added mail 'm' option
* fixed number entry on source selection to allow for up to MAXINT sources
* there is now a pause after viewing a document so if the pager is 'more'
* the user will not miss the last screen.
*
* Revision 1.6 changes 01/92 by jcurran@nnsc.nsf.net
*
* fixed common_wais_dir on help message
* change default common dir to /usr/lib/wais-sources
* fix formatting for >99 sources
* add ^v aliases for page down, <esc>v for page up
* add "/" (find) to find source
* add "/" (find) to find result
* simplify <return> processing for users
* changed the view source information to pipe through $PAGER or 'more'
* to allow the use of source descriptions larger than 1 screen.
* (done by datta@cs.uwp.edu)
*
* Revision 1.7 changes 01/92 by jcurran@nnsc.nsf.net
*
* fixed miscellaneous selection bugs
* added option processing and option screen
*
*
* Notes:
* If there are ever more than 999 sources screen display will need
* changes.
*
* The use of mvprintw() is dangerous unless there is window bounds
* checking. The curses with ULTRIX 4.2, BSD 4.3 and BSD 4.3 reno
* have unpredictable results when the window size is exceeded.
* Keep this in mind for further enhancements.
*
* The ULTRIX curses.h may be missing some entries and may require
* updating. If so, add a DEFINE ULTRIX when you compile
*
*/
#include <curses.h>
#include <signal.h>
#include <setjmp.h>
#include <ctype.h>
#include <ui.h>
#include <sockets.h>
#include <sys/types.h>
#include <netinet/in.h>
#if (defined(ULTRIX) || defined(ultrix))
/*
* ULTRIX 4.2 curses.h is missing these entries
*/
#define erasechar() (_tty.sg_erase)
#define killchar() (_tty.sg_kill)
#endif /* def ULTRIX */
#define STRINGSIZE 256
#include "wais.h"
#define MAIN
#include "globals.h"
#define WAIS_SERVICE "z39_50"
#define WAISSCREEN_NAME "SWAIS"
#define WAISSCREEN_VERSION "$Revision: 1.10 $"
#define WAISSCREEN_AUTHOR "John Curran (jcurran@nnsc.nsf.net)"
#ifndef COMMON_SOURCE_DIR
#define COMMON_SOURCE_DIR "/usr/lib/wais-sources"
#endif
/* SWAIS PROGRAM STATES - each decade shares common screen (0-9, 10-19, etc) */
#define UNKNOWN 0
#define GETSOURCES 10
#define GETKEYWORDS 11
#define MAKEQUERY 12
#define SHOWRESULTS 20
#define GETOPTIONS 30
#define LEAVEPROGRAM 90
typedef int programstate;
/* SWAIS OPTION TYPES */
#define OPTION_BOOLEAN 0
#define OPTION_INTEGER 1
#define OPTION_STRING 2
typedef struct option {
char name[STRINGSIZE];
char desc[STRINGSIZE];
int type;
void (* update)();
union {
int* intptr;
char* charptr;
} var;
} _Option, *Option;
/* options */
#define MAXOPTIONS 6
int option_widetitles=FALSE;
int option_sortsources=TRUE;
#if 0
int option_pagerpause=TRUE;
#else
int option_pagerpause=FALSE;
#endif
_Option options[MAXOPTIONS+1];
char* log_file_name = NULL;
FILE* logfile = NULL;
programstate state;
programstate new_state;
jmp_buf main_env;
char keywords[STRINGSIZE];
SList Selected_Sources;
char command[STRINGSIZE];
char *sdir, *cdir;
#define MAXSELECTIONS 500
#define NOSELECTION -999999
char select_line[MAXSELECTIONS][STRINGSIZE];
int selection; /* 1 to max_selection */
int max_selection; /* limit on selection */
int current_page; /* 0 to needed pages; preset to -1 to force refresh */
int page_length; /* number of selections per page */
/* routine specific selection number */
int source_selection=1;
int result_selection=1;
int option_selection=1;
extern unsigned int sleep _AP((unsigned int seconds));
void SortSources()
{
Boolean Changed = TRUE;
Source s;
SList sl;
while(Changed) {
Changed = FALSE;
for(sl = Sources; sl->nextSource != NULL; sl = sl->nextSource) {
if(sl->nextSource->thisSource->name == NULL) {
Changed = TRUE;
sl->nextSource = sl->nextSource->nextSource;
}
else
if(0 < strcasecmp(sl->thisSource->name, sl->nextSource->thisSource->name)) {
Changed = TRUE;
s = sl->thisSource;
sl->thisSource = sl->nextSource->thisSource;
sl->nextSource->thisSource = s;
}
}
}
}
void screenend() {
signal(SIGINT,SIG_IGN);
clear();
refresh();
endwin();
echo();
}
void startover() {
longjmp(main_env,1);
}
void screenstart() {
static int init;
if (!init) {
initscr();
init=1;
} else {
/* wrefresh(); Maybye they meant refresh... yeah, thats it...
andyj */
refresh();
}
cbreak();
noecho();
leaveok(stdscr,FALSE);
signal(SIGINT,startover);
}
void
display_context(context)
char *context;
{
mvprintw(LINES-3,0,context);
clrtoeol();
refresh();
}
void
display_prompt(prompt)
char *prompt;
{
mvprintw(LINES-1,0,prompt);
clrtoeol();
refresh();
}
void
display_highlighted(str)
char *str;
{
standout();
mvprintw(LINES-1,0,str);
standend();
printw(" ");
clrtoeol();
refresh();
}
void
PrintStatus(str)
char *str;
{
if (stdscr!=NULL) {
display_highlighted(str);
sleep(2);
}
else
fprintf(stderr,"%s\n",str);
}
char *
firstphrase(str)
char *str;
{
char *res;
int n;
res = str;
if ((n=strcspn(str," "))!=0)
if ((n>4) && (str[n-4]=='.')) {
n = n - 4;
res = s_malloc(n+1);
strncpy(res,str,n);
}
return res;
}
void
format_option(str,opt)
char *str;
Option opt;
{
switch (opt->type) {
case OPTION_STRING: sprintf(str,"%s", (opt->var.charptr) );
break;
case OPTION_INTEGER: sprintf(str,"%d", * (opt->var.intptr) );
break;
case OPTION_BOOLEAN: if (* (opt->var.intptr) == TRUE)
sprintf(str,"on");
else
sprintf(str,"off");
break;
}
}
jmp_buf local_env;
char fpath[STRINGSIZE];
void
start_use(fd)
FILE **fd;
{
*fd = fopen(fpath,"w+");
}
void
end_use(fd)
FILE **fd;
{
fclose(*fd);
}
void
null()
{
}
void
Refresh_sources()
{
FreeSources(Sources);
Sources = NULL;
ReadSourceDirectory(sdir,TRUE);
ReadSourceDirectory(cdir,TRUE);
if (NumSources == 0) {
PrintStatus("Error: Unable to find any WAIS information sources.");
exit(-1);
}
if (option_sortsources==TRUE) SortSources();
}
void
UseWaisDocument(q, doc)
Question q;
DocumentID doc;
{
char message[STRINGSIZE];
if (strcmp(doc->doc->type, "WSRC")) {
fprintf(stderr, "%s", "%s is not a WAIS source. You can only USE WAIS sources.",
firstphrase(trim_junk(doc->doc->headline)));
/* PrintStatus("%s is not a WAIS source. You can only USE WAIS sources.",
firstphrase(trim_junk(doc->doc->headline))); */
}
else {
sprintf(message,"Retrieving: %s\n", firstphrase(trim_junk(doc->doc->headline)));
PrintStatus(message);
sprintf(fpath,"%s%s.src", sdir, firstphrase(trim_junk(doc->doc->headline)));
RetrieveWaisDocument(start_use, end_use, q, doc);
sprintf(message,"Adding Source: %s\n", firstphrase(trim_junk(doc->doc->headline)));
PrintStatus(message);
Refresh_sources();
}
}
jmp_buf local_env;
void screen_catchpipe(sig, code, scp, addr)
int sig, code;
struct sigcontext *scp;
char *addr;
{
longjmp(local_env,1);
}
char pipe_cmd[STRINGSIZE];
void
start_pipe(pipefd)
FILE **pipefd;
{
screenend();
*pipefd = popen(pipe_cmd,"w");
}
void
end_pipe(pipefd)
FILE **pipefd;
{
pclose(*pipefd);
}
void
PipeWaisDocument(q, doc, cmd)
Question q;
DocumentID doc;
char *cmd;
{
char message[STRINGSIZE];
sprintf(message,"Retrieving: %s\n",firstphrase(trim_junk(doc->doc->headline)));
PrintStatus(message);
strcpy(pipe_cmd,cmd);
signal(SIGPIPE,screen_catchpipe);
if (setjmp(local_env)==0) RetrieveWaisDocument(start_pipe,end_pipe,q,doc);
signal(SIGPIPE,SIG_DFL);
}
void
FreeSourceList(sources)
SourceList sources;
{
SourceList s, n;
for (s = sources; s != NULL; s = n) {
if (s->thisSource != NULL) {
if (s->thisSource->filename != NULL)
s_free(s->thisSource->filename);
s_free(s->thisSource);
}
n = s->nextSource;
s_free(s);
}
}
void AddQuestionSource(question, sourcename)
Question question;
char *sourcename;
{
SourceList tmp;
SourceList s;
SourceID sid;
sid = (SourceID)s_malloc(sizeof(_SourceID));
sid->filename = s_strdup(sourcename);
s = (SourceList)s_malloc(sizeof(_SourceList));
s->thisSource = sid;
s->nextSource = NULL;
tmp = question->Sources;
question->Sources = s;
if (tmp != NULL)
s->nextSource = tmp;
}
void
usage(name)
char *name;
{
fprintf(stderr,"Usage: %s\n",name);
fprintf(stderr," [-s sourcname] select sourcename for search\n");
fprintf(stderr," [-S sourcedir] defaults to ~/wais-sources\n");
fprintf(stderr," [-C common_sourcedir] defaults to %s\n",COMMON_SOURCE_DIR);
fprintf(stderr," [-h] this help message\n");
fprintf(stderr," [keywords]\n");
}
SourceID FindQuestionSource(sourcelist, sourcename)
SourceList sourcelist;
char *sourcename;
{
SourceList tmpsource;
for(tmpsource = sourcelist; tmpsource != NULL;
tmpsource = tmpsource->nextSource) {
if (tmpsource->thisSource != NULL)
if (!strcmp(sourcename, tmpsource->thisSource->filename))
return(tmpsource->thisSource);
}
return(NULL);
}
Source FindSource(sourcelist, sourcename)
SList sourcelist;
char *sourcename;
{
SList tmpsource;
for(tmpsource = sourcelist; tmpsource != NULL;
tmpsource = tmpsource->nextSource) {
if (tmpsource->thisSource != NULL)
if (!strcmp(sourcename, tmpsource->thisSource->name))
return(tmpsource->thisSource);
}
return(NULL);
}
void
DumpSources(sourcelist)
SList sourcelist;
{
SList tmpsource;
if (sourcelist == NULL) {
printf("Sourcelist NULL");
return;
}
printf(" Dump of Sourcelist \n");
for(tmpsource = sourcelist; tmpsource != NULL; tmpsource = tmpsource->nextSource) {
if (tmpsource->thisSource == NULL)
printf(" thisSource NULL\n");
else
printf(" thisSource = %s\n",tmpsource->thisSource->name);
if (tmpsource->nextSource == NULL)
printf(" nextSource NULL\n");
else
printf(" following nextSource ->\n");
}
}
SList
AddSource(sourcelist,currentsource)
SList sourcelist;
Source currentsource;
{
Source s;
SList tmpsource;
SList last;
if (sourcelist == NULL)
sourcelist = makeSList(NULL,NULL);
last=sourcelist;
for(tmpsource = sourcelist; tmpsource != NULL;
last = tmpsource, tmpsource = tmpsource->nextSource)
if (tmpsource->thisSource != NULL)
if (!strcmp(currentsource->name, tmpsource->thisSource->name))
return(sourcelist);
s = (Source) s_malloc(sizeof(_Source));
s->initp = currentsource->initp;
s->name = s_strdup(currentsource->name);
s->directory = s_strdup(currentsource->directory);
if (last->thisSource == NULL)
last->thisSource = s;
else
last->nextSource = makeSList(s, NULL);
return(sourcelist);
}
SList
DeleteSource(sourcelist,currentsource)
SList sourcelist;
Source currentsource;
{
SList s;
SList tmpsource;
SList last;
if (sourcelist == NULL)
return(NULL);
last=sourcelist;
for(tmpsource = sourcelist; tmpsource != NULL;
last = tmpsource, tmpsource = tmpsource->nextSource)
if (tmpsource->thisSource != NULL)
if (!strcmp(currentsource->name, tmpsource->thisSource->name)) {
if(tmpsource->thisSource->name != NULL)
s_free (tmpsource->thisSource->name);
if(tmpsource->thisSource->directory != NULL)
s_free (tmpsource->thisSource->directory);
if(tmpsource->thisSource->maintainer != NULL)
s_free (tmpsource->thisSource->maintainer);
/* save next link ptr, discard current link */
s = tmpsource->nextSource;
s_free (tmpsource);
/* return next as start if start destroyed */
if (last==sourcelist)
return(s);
/* Splice next into position, return start ptr */
last->nextSource = s;
break;
}
return(sourcelist);
}
char *
fixdirname(dir)
char *dir;
{
char *res;
if(dir[strlen(dir)-1] == '/') res = dir;
else {
res = s_malloc(strlen(dir)+2);
sprintf(res,"%s/", dir);
}
return res;
}
int
selection_page(sel)
int sel;
{
return(((sel-1) / page_length));
}
int
selection_line(sel)
int sel;
{
return(((sel-1) % page_length)+2);
}
selection_display(new_sel)
int new_sel;
{
int new_page;
int new_selection;
int sel_offset;
int k;
standend();
mvprintw(selection_line(selection),0,"%s",select_line[selection]);
if (new_sel==NOSELECTION)
new_selection = selection;
else
new_selection = new_sel;
if (new_selection < 1)
new_selection = max_selection;
if (new_selection > max_selection)
new_selection = 1;
new_page = selection_page(new_selection);
if (current_page!=new_page) {
sel_offset = new_page * page_length;
for (k = 1; k <= page_length; k++)
if ((sel_offset+k)<=max_selection)
mvprintw(1+k,0,"%s",select_line[sel_offset+k]);
else
mvprintw(1+k,0,"\n");
}
if (new_sel!=NOSELECTION) {
standout();
mvprintw(selection_line(new_selection),0,"%s",select_line[new_selection]);
standend();
}
move(selection_line(new_selection),0);
current_page = new_page;
selection = new_selection;
refresh();
}
void
title_display(title,status,status_count)
char *title;
char *status;
int status_count;
{
mvprintw(0,0,WAISSCREEN_NAME);
standout();
mvprintw(0,COLS/2-(strlen(title)/2),"%s", title);
standend();
mvprintw(0,COLS-(strlen(status)+4),"%s %2ld", status, status_count);
}
void
show_source_entry_help()
{
int j=2;
clear();
title_display("Source Selection Help","Page:",1);
mvprintw(j++,0,"%s\t%s","j, down arrow, ^N","Move Down one source");
mvprintw(j++,0,"%s\t%s","k, up arrow, ^P ","Move Up one source");
mvprintw(j++,0,"%s\t%s","J, ^V, ^D ","Move Down one screen");
mvprintw(j++,0,"%s\t%s","K, <esc> v, ^U ","Move Up one screen");
mvprintw(j++,0,"%s\t%s","### ","Position to source number ##");
mvprintw(j++,0,"%s\t%s","/sss ","Search for source sss");
mvprintw(j++,0,"%s\t%s","<space>, <period>","Select current source");
mvprintw(j++,0,"%s\t%s","= ","Deselect all sources");
mvprintw(j++,0,"%s\t%s","v, <comma> ","View current source info");
mvprintw(j++,0,"%s\t%s","<ret> ","Perform search");
mvprintw(j++,0,"%s\t%s","s ","Select new sources (refresh sources list)");
mvprintw(j++,0,"%s\t%s","w ","Select new keywords");
mvprintw(j++,0,"%s\t%s","X, - ","Remove current source permanently");
mvprintw(j++,0,"%s\t%s","o ","Set and show swais options");
mvprintw(j++,0,"%s\t%s","h, ? ","Show this help display");
mvprintw(j++,0,"%s\t%s","H ","Display program history");
mvprintw(j++,0,"%s\t%s","q ","Leave this program");
PrintStatus("Press any key to continue");
getch();
}
void
view_source_info(sourcelist,current_s)
SList sourcelist;
Source current_s;
{
FILE *fp;
int j=2;
char tmp_str[STRINGSIZE];
sprintf(pipe_cmd,"${PAGER-more}");
start_pipe(&fp);
if (NULL != current_s->name)
fprintf(fp,"\n%s\t%s\n","Name: ",current_s->name);
if (NULL != current_s->directory)
fprintf(fp,"%s\t%s\n","Directory: ",current_s->directory);
if (NULL != current_s->maintainer)
fprintf(fp,"%s\t%s\n","Maintainer: ",current_s->maintainer);
if (NULL != FindSource(sourcelist,current_s->name))
sprintf(tmp_str,"Yes");
else
sprintf(tmp_str,"No");
fprintf(fp,"%s\t%s\n","Selected: ",tmp_str);
format_source_cost(tmp_str,current_s);
fprintf(fp,"%s\t%s\n","Cost: ",tmp_str);
if (current_s->initp)
sprintf(tmp_str,"(Accessed)");
else
tmp_str[0]='\0';
if (NULL != current_s->server)
fprintf(fp,"%s\t%s %s\n","Server: ",current_s->server,tmp_str);
if (NULL != current_s->service)
fprintf(fp,"%s\t%s\n","Service: ",current_s->service);
if (NULL != current_s->database)
fprintf(fp,"%s\t%s\n","Database: ",current_s->database);
if (NULL != current_s->description) {
fprintf(fp,"%s\n","Description:");
fprintf(fp,"%s\n",current_s->description);
}
end_pipe(&fp);
cbreak();
noecho();
PrintStatus("Press any key to continue.");
getch();
}
void
view_result_info(current_doc)
DocumentID current_doc;
{
int j=2;
char tmp_str[STRINGSIZE];
clear();
title_display("Result Information","Page:",1);
/* sure.. someday these might have data. jtc
GetServer(current_doc->doc->id,tmp_str);
mvprintw(j++,0,"%s\t%s","Server: ",tmp_str);
GetDatabase(current_doc->doc->id,tmp_str);
mvprintw(j++,0,"%s\t%s","Database: ",tmp_str);
GetLocalID(current_doc->doc->id,tmp_str);
mvprintw(j++,0,"%s\t%s","Local ID: ",tmp_str);
*/
if (NULL != current_doc->doc->date)
mvprintw(j++,0,"%s\t%s","Date: ",current_doc->doc->date);
if (NULL != current_doc->doc->headline)
mvprintw(j++,0,"%s\t%s","Source: ",current_doc->doc->source);
if (NULL != current_doc->doc->headline)
mvprintw(j++,0,"%s\t%s","Headline: ",current_doc->doc->headline);
if (NULL != current_doc->doc->city)
mvprintw(j++,0,"%s\t%s","City: ",current_doc->doc->city);
if (NULL != current_doc->doc->stock)
mvprintw(j++,0,"%s\t%s","Stock: ",current_doc->doc->stock);
if (NULL != current_doc->doc->company)
mvprintw(j++,0,"%s\t%s","Company: ",current_doc->doc->company);
if (NULL != current_doc->doc->industry)
mvprintw(j++,0,"%s\t%s","Industry: ",current_doc->doc->industry);
if (NULL != current_doc->doc->type)
mvprintw(j++,0,"%s\t%s","Type: ",current_doc->doc->type);
mvprintw(j++,0,"%s\t%d","Score ",current_doc->rawScore);
mvprintw(j++,0,"%s\t%ld","# of Lines: ",current_doc->doc->numLines);
mvprintw(j++,0,"%s\t%ld","# of Chars: ",current_doc->doc->numChars);
if (NULL != current_doc->doc->sourceID->filename)
mvprintw(j++,0,"%s\t%s","SourceID: ",current_doc->doc->sourceID->filename);
switch (GetCopyrightDisposition(current_doc->doc->id)) {
case (COPY_WITHOUT_RESTRICTION) : sprintf(tmp_str,"Copy Without Restriction");
break;
case (ALL_RIGHTS_RESERVED) : sprintf(tmp_str,"All Rights Reserved");
break;
case (DISTRIBUTION_RESTRICTIONS_APPLY) : sprintf(tmp_str,"Distribution Restrictions Apply");
break;
default : sprintf(tmp_str,"Unknown");
break;
}
mvprintw(j++,0,"%s\t%s","Disposition: ",tmp_str);
PrintStatus("Press any key to continue");
getch();
}
void
show_swais_history()
{
char versiononly[STRINGSIZE];
int j=2;
clear();
title_display("SWAIS History","Page:",1);
mvprintw(j++,0,"%s"," ");
mvprintw(j++,0,"%s",
"The WAIS (Wide Area Information Service) system is a collection of programs");
mvprintw(j++,0,"%s",
"which provide for convenient information distribution over wide area networks.");
mvprintw(j++,0,"%s",
"Tools for both \"publishing\" and accessing information sources are provided.");
mvprintw(j++,0,"%s",
"The Simple WAIS (SWAIS) interface is an basic access tool designed for those");
mvprintw(j++,0,"%s",
"focused on data retreival and not computer operation. It provides most of the");
mvprintw(j++,0,"%s",
"functionality of the more complicated interfaces but features a simple and");
mvprintw(j++,0,"%s",
"potentially more natural interface. The functionality supported includes ");
mvprintw(j++,0,"%s",
"source selection, keyword entry, and automatic document retrieval.");
mvprintw(j++,0,"%s",
"I hope that this tool may be of use. Enjoy.");
mvprintw(j++,0,"%s"," ");
mvprintw(j++,0,"%s",
"The WAIS system is the result of a joint project between Thinking Machines,");
mvprintw(j++,0,"%s",
"Apple Computer, and Dow Jones. For more information on WAIS, send mail to");
mvprintw(j++,0,"%s",
"\"wais-discussion@think.com\". The current release of the WAIS software");
mvprintw(j++,0,"%s",
"is available via anonymous ftp from think.com in subdirectory wais.");
sscanf(WAISSCREEN_VERSION,"$ %*s %s",versiononly);
mvprintw(LINES-5,0,"Simple Wais %s [built with %s]", versiononly,VERSION);
mvprintw(LINES-3,0,"%s", WAISSCREEN_AUTHOR);
PrintStatus("Press any key to continue");
getch();
}
void
show_search_results_help()
{
int j=2;
clear();
title_display("Search Results Help","Page:",1);
mvprintw(j++,0,"%s\t\t%s","j, ^N ","Move Down one item");
mvprintw(j++,0,"%s\t\t%s","k, ^P ","Move Up one item");
mvprintw(j++,0,"%s\t\t%s","J ","Move Down one screen");
mvprintw(j++,0,"%s\t\t%s","K ","Move Up one screen");
mvprintw(j++,0,"%s\t\t%s","m ","Mail current item to an address");
mvprintw(j++,0,"%s\t\t%s","## ","Position to item number ##");
mvprintw(j++,0,"%s\t\t%s","/sss ","Position to item beginning sss");
mvprintw(j++,0,"%s\t\t%s","<space>","Display current item");
mvprintw(j++,0,"%s\t\t%s","<return>","Display current item");
mvprintw(j++,0,"%s\t\t%s","| ","Pipe current item into a unix command");
mvprintw(j++,0,"%s\t\t%s","v ","View current item information");
mvprintw(j++,0,"%s\t\t%s","s ","Specify new sources to search");
mvprintw(j++,0,"%s\t\t%s","u ","Use it; add it to the list of sources");
mvprintw(j++,0,"%s\t\t%s","w ","Make another search with new keywords");
mvprintw(j++,0,"%s\t\t%s","o ","Set and show swais options");
mvprintw(j++,0,"%s\t\t%s","h ","Show this help display");
mvprintw(j++,0,"%s\t\t%s","H ","Display program history");
mvprintw(j++,0,"%s\t\t%s","q ","Leave this program");
PrintStatus("Press any key to continue");
getch();
}
int
get_input_string(str)
char str[STRINGSIZE];
{
int startcol, startline;
int pos;
char ch;
getyx(stdscr, startline, startcol);
addstr(str);
clrtoeol();
refresh();
pos = strlen(str);
while(TRUE) {
ch=getch();
if (ch==killchar()) {
move(startline, startcol);
clrtoeol();
refresh();
str[0] = 0;
pos = 0;
}
else
if ((ch==erasechar())||(ch==127)) {
if (pos>0) {
str[--pos]='\0';
mvaddch(startline,startcol+pos,' ');
move(startline,startcol+pos);
refresh();
}
else {
str[0]='\0';
break;
}
}
else
if (ch=='\n')
break;
else
if (isprint(ch)){
str[pos++]=ch;
str[pos]='\0';
addch(ch);
refresh();
}
}
display_prompt("");
return(str[0]!='\0');
}
void
display_source_selected(sourcelist,currentsource)
SList sourcelist;
Source currentsource;
{
if (NULL != FindSource(sourcelist,currentsource->name)) {
mvprintw(selection_line(selection),5,"*");
}
else {
mvprintw(selection_line(selection),5," ");
}
}
void
source_selected(sourcelist,currentsource,sel)
SList sourcelist;
Source currentsource;
{
if (NULL != FindSource(sourcelist,currentsource->name)) {
select_line[sel][5] = '*';
}
else {
select_line[sel][5] = ' ';
}
}
programstate
nextstate(question)
Question question;
{
if ((question->numsources==0) || !(question->modified)) {
return(GETSOURCES);
}
return(GETKEYWORDS);
}
programstate
makequery_state(question)
Question question;
{
SList asource;
/* rebuild question source list from Selected_Sources */
FreeSourceList(question->Sources);
question->Sources = NULL;
/* build new question source list */
for (asource = Selected_Sources;
asource != NULL ; asource = asource->nextSource)
if (asource->thisSource != NULL)
AddQuestionSource(question,asource->thisSource->name);
question->numsources = listlength((List)question->Sources);
question->RelevantDocuments = NULL;
question->numdocs = listlength((List)question->RelevantDocuments);
question->ResultDocuments = NULL;
question->numresdocs = listlength((List)question->ResultDocuments);
SearchWais(question);
question->modified = FALSE;
if(question->numresdocs > 0) {
result_selection = 1;
return(SHOWRESULTS);
} else
return(nextstate(question));
}
void
option_screen(question)
Question question;
{
DocList doclist;
DocumentID current_doc;
int k;
int option_count;
char fstr[STRINGSIZE];
char tstr[STRINGSIZE];
char *sourcename;
option_count = MAXOPTIONS;
title_display("Option Settings","Options:", option_count);
mvprintw(1,2,"# Option Value ");
sprintf(fstr,"%%03d: %%-12.12s %%-%d.%ds",COLS-22,COLS-22);
for (k=1; k <= option_count; k++) {
format_option(tstr,options[k]);
sprintf(select_line[k], fstr, k, options[k].name, tstr);
}
selection = option_selection;
current_page = -1;
max_selection= option_count;
page_length= MIN(LINES-6, option_count);
selection_display(NOSELECTION);
}
programstate
option_state(question)
Question question;
{
char user_key[STRINGSIZE];
char digit_str[STRINGSIZE];
int k,miss, option_count;
option_count = MAXOPTIONS+1;
selection_display(selection);
display_context(options[selection].desc);
digit_str[0]='\0';
while(TRUE) {
display_prompt("<space> to change, arrows to move, s for sources, r for results, ? for help");
user_key[0]=getch();
switch(user_key[0]) {
case 'h' : ;
case '?' : show_search_results_help();
state=UNKNOWN;
return(GETOPTIONS);
/* forgive me: hardwired arrow keys for vt100 since we're
not using SysV curses and bsd curses lacks key support */
case '\033' : user_key[1]=getch();
user_key[2]=getch();
user_key[3]='\0';
if (strcmp(user_key, "\033[A")) {
selection_display(selection+1);
display_context(options[selection].desc);
option_selection = selection;
break;
}
if (strcmp(user_key, "\033[B")) {
selection_display(selection-1);
display_context(options[selection].desc);
option_selection = selection;
break;
}
/* emacs <meta>v page previous */
if (user_key[1]=='v') {
selection_display(selection-page_length);
display_context(options[selection].desc);
option_selection = selection;
break;
}
break;
case 10 : ;
case ' ' : k = selection;
switch (options[k].type) {
case OPTION_INTEGER :
digit_str[0]='\0';
mvprintw(LINES-3,0,"New Value: ");
get_input_string(digit_str);
if (atoi(digit_str)!= 0) {
*(options[k].var.intptr) = atoi(digit_str);
options[k].update();
}
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
break;
case OPTION_STRING :
digit_str[0]='\0';
mvprintw(LINES-3,0,"New Value: ");
if (get_input_string(digit_str)){
strcpy(options[k].var.charptr, digit_str);
options[k].update();
}
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
break;
case OPTION_BOOLEAN :
if (* (options[k].var.intptr) == TRUE)
*(options[k].var.intptr) = FALSE;
else
*(options[k].var.intptr) = TRUE;
options[k].update();
break;
}
state=UNKNOWN;
return(GETOPTIONS);
case 14 : ;
case 'j' : selection_display(selection+1);
display_context(options[selection].desc);
option_selection = selection;
break;
case 16 : ;
case 'k' : selection_display(selection-1);
display_context(options[selection].desc);
option_selection = selection;
break;
case 'q' : return(LEAVEPROGRAM);
case 's' : return(GETSOURCES);
case 'r' : if(question->numresdocs > 0) return(SHOWRESULTS);break;
case 'w' : return(GETKEYWORDS);
case 18 : ;
case '\f' : wrefresh(curscr);
break;
case '/' : user_key[0] = '\0';
mvprintw(LINES-3,0,"Option Name: ");
get_input_string(user_key);
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
refresh();
if (strlen(user_key)) {
miss = TRUE;
for (k=1 ; k <= option_count ; k++ ) {
if (!strncasecmp(user_key,options[k].name,
strlen(user_key))) {
selection_display(k);
option_selection = k;
miss = FALSE;
break;
}
}
if (miss=TRUE) PrintStatus("Unable to find item");
}
display_context(options[option_selection].desc);
break;
case 4 : ;
case 22 : ; /* emacs ctrl-v */
case 'J' : selection_display(selection+page_length);
display_context(options[selection].desc);
option_selection = selection;
break;
case 21 : ;
case 'K' : selection_display(selection-page_length);
display_context(options[selection].desc);
option_selection = selection;
break;
default : if (isdigit(user_key[0])) {
digit_str[0] = user_key[0];
digit_str[1] = '\0';
mvprintw(LINES-3,0,"Item Number: ");
get_input_string(digit_str);
if (atoi(digit_str)!= 0) {
selection_display(atoi(digit_str));
option_selection = selection;
}
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
display_context(options[selection].desc);
}
}
}
}
void
source_screen(question)
Question question;
{
int k;
int source_count;
Source current_s;
SList asource;
char fstr[STRINGSIZE];
source_count = listlength((List)Sources);
title_display("Source Selection","Sources:",source_count);
mvprintw(1,2,"# Server Source Cost");
sprintf(fstr,"%%03d: [%%20.20s] %%-%d.%ds %%16.16s",COLS-49,COLS-49);
k = 1;
for (asource = Sources; asource != NULL ; asource = asource->nextSource) {
char tmpstr[STRINGSIZE];
char cost_str[STRINGSIZE];
current_s=asource->thisSource;
tmpstr[0]='\0';
if (strstr(current_s->name,".src")!=NULL)
strncat(tmpstr, current_s->name, strlen(current_s->name)-4);
else
strcat(tmpstr, current_s->name);
format_source_cost(cost_str,current_s);
sprintf(select_line[k], fstr, k, current_s->server, tmpstr, cost_str);
source_selected(Selected_Sources,current_s,k);
k++;
}
selection = source_selection;
current_page = -1;
max_selection=source_count;
page_length= MIN(LINES-6, source_count);
selection_display(NOSELECTION);
mvprintw(LINES-3,0,"Keywords:");
mvprintw(LINES-3,10,"%s",question->keywords);
refresh();
}
programstate
source_state(question)
Question question;
{
int miss,k;
/* int source_count; */
/* Source current_s; */
SList asource;
char user_key[STRINGSIZE];
char digit_str[STRINGSIZE];
char message[STRINGSIZE];
/* source_count = listlength((List)Sources); */
selection_display(selection);
digit_str[0]='\0';
while(TRUE) {
display_prompt("<space> selects, w for keywords, arrows move, <return> searches, q quits, or ?");
user_key[0]=getch();
switch(user_key[0]) {
case 'H' : show_swais_history();
state=UNKNOWN;
return(GETSOURCES);
case 'h' : ;
case '?' : show_source_entry_help();
state=UNKNOWN;
return(GETSOURCES);
/* forgive me: hardwired arrow keys for vt100 since we're
not using SysV curses and bsd curses lacks key support */
case '\033' : user_key[1]=getch();
user_key[2]=getch();
user_key[3]='\0';
if (strcmp(user_key, "\033[A")) {
selection_display(selection+1);
source_selection = selection;
break;
}
if (strcmp(user_key, "\033[B")) {
selection_display(selection-1);
source_selection = selection;
break;
}
/* emacs <meta>v page previous */
if (user_key[1]=='v') {
selection_display(selection-page_length);
source_selection = selection;
break;
}
break;
case 'o' : return(GETOPTIONS);
case ',' : ;
case 'v' : k = 0;
for (asource = Sources;
asource != NULL ; asource = asource->nextSource) {
k++;
if (k==selection) break;
}
view_source_info(Selected_Sources,asource->thisSource);
state=UNKNOWN;
return(GETSOURCES);
case 'X' : ;
case '-' : k = 0;
for (asource = Sources;
asource != NULL ; asource = asource->nextSource) {
k++;
if (k==selection) break;
}
sprintf(fpath,"%s%s.src", sdir, firstphrase(trim_junk(asource->thisSource->name)));
sprintf(message,"Removing Source: %s\n", firstphrase(trim_junk(asource->thisSource->name)));
PrintStatus(message);
if (unlink(fpath)==0) {
if (FindSource(Selected_Sources,asource->thisSource->name)) {
Selected_Sources = DeleteSource(Selected_Sources,asource->thisSource);
question->numsources--;
question->modified=TRUE;
}
FreeSources(Sources);
Sources = NULL;
ReadSourceDirectory(sdir,TRUE);
ReadSourceDirectory(cdir,TRUE);
state=UNKNOWN;
return(GETSOURCES);
}
PrintStatus("Unable to remove common sources");
break;
case '/' : user_key[0] = '\0';
mvprintw(LINES-3,0,"Source Name: ");
get_input_string(user_key);
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
refresh();
if (strlen(user_key)) {
k=0; miss = TRUE;
for (asource = Sources;
asource != NULL ; asource = asource->nextSource) {
k++;
if (asource->thisSource != NULL)
if (!strncasecmp(user_key,
asource->thisSource->name, strlen(user_key))) {
selection_display(k);
source_selection = k;
miss = FALSE;
break;
}
}
if (miss) PrintStatus("Unable to find source");
}
break;
case '=' : k = 0;
for (asource = Sources;
asource != NULL ; asource = asource->nextSource) {
k++;
if (FindSource(Selected_Sources,
asource->thisSource->name)) {
Selected_Sources = DeleteSource(Selected_Sources,asource->thisSource);
question->numsources--;
question->modified=TRUE;
display_source_selected(Selected_Sources,asource->thisSource);
source_selected(Selected_Sources,asource->thisSource,k);
selection_display(k);
}
}
break;
case '.' : ;
case ' ' : k = 0;
for (asource = Sources;
asource != NULL ; asource = asource->nextSource) {
k++;
if (k==selection) break;
}
if (FindSource(Selected_Sources,asource->thisSource->name)) {
Selected_Sources = DeleteSource(Selected_Sources,asource->thisSource);
question->numsources--;
question->modified=TRUE;
}
else {
Selected_Sources = AddSource(Selected_Sources,asource->thisSource);
question->numsources++;
question->modified=TRUE;
}
display_source_selected(Selected_Sources,asource->thisSource);
source_selected(Selected_Sources,asource->thisSource,selection);
selection_display(selection);
break;
case 14 : ;
case 'j' : selection_display(selection+1);
source_selection = selection;
break;
case 16 : ;
case 'k' : selection_display(selection-1);
source_selection = selection;
break;
case 'q' : return(LEAVEPROGRAM);
case 'r' : if(question->numresdocs > 0) return(SHOWRESULTS);break;
case 's' : return(GETSOURCES);
case 10 : k = 0;
for (asource = Sources;
asource != NULL ; asource = asource->nextSource) {
k++;
if (k==selection) break;
}
if (NULL == FindSource(Selected_Sources,asource->thisSource)) {
Selected_Sources = AddSource(Selected_Sources,asource->thisSource);
question->numsources++;
question->modified=TRUE;
}
display_source_selected(Selected_Sources,asource->thisSource);
source_selected(Selected_Sources,asource->thisSource,selection);
selection_display(selection);
return(nextstate(question));
case 'w' : return(GETKEYWORDS);
case 18 : ;
case '\f' : wrefresh(curscr);
break;
case 4 : ;
case 22 : ; /* ctrl-v */
case 'J' : selection_display(selection+page_length);
source_selection = selection;
break;
case 21 : ;
case 'K' : selection_display(selection-page_length);
source_selection = selection;
break;
default : if (isdigit(user_key[0])) {
digit_str[0] = user_key[0];
digit_str[1] = '\0';
mvprintw(LINES-3,0,"Source Number: ");
get_input_string(digit_str);
if (atoi(digit_str)!= 0) {
selection_display(atoi(digit_str));
}
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
mvprintw(LINES-3,0,"Keywords:");
mvprintw(LINES-3,10,"%s",question->keywords);
}
}
}
}
void
mail_command(question)
Question question;
{
char tmpstr[STRINGSIZE];
display_prompt("Enter your e-mail address; ^C to cancel");
standout();
tmpstr[0]='\0';
strcat(tmpstr,"mail ");
mvprintw(LINES-3,0,"Address:");
standend();
move(LINES-3,9);
if (get_input_string(command)) {
standend();
mvprintw(LINES-3,0,"Address:");
refresh();
strcat(tmpstr,command);
mvprintw(LINES-2,0,tmpstr);
PipeWaisDocument(question, findDoc(question->ResultDocuments,selection-1),tmpstr);
cbreak();
screenstart();
}
standend();
mvprintw(LINES-3,0,"\n");
display_prompt("");
refresh();
}
void
pipe_command(question)
Question question;
{
display_prompt("Enter the command to be executed on this item; ^C to cancel");
standout();
mvprintw(LINES-3,0,"Command:");
standend();
move(LINES-3,9);
if (get_input_string(command)) {
standend();
mvprintw(LINES-3,0,"Command:");
refresh();
PipeWaisDocument(question, findDoc(question->ResultDocuments,selection-1),command);
cbreak();
noecho();
PrintStatus("Press any key to continue");
getch();
cbreak();
screenstart();
}
standend();
mvprintw(LINES-3,0,"\n");
display_prompt("");
refresh();
}
keyword_state(question)
Question question;
{
display_prompt("Enter keywords with spaces between them; <return> to search; ^C to cancel");
standout();
mvprintw(LINES-3,0,"Keywords:");
standend();
move(LINES-3,10);
strcpy(keywords,question->keywords);
if (get_input_string(keywords)) {
standend();
mvprintw(LINES-3,0,"Keywords:");
refresh();
strcpy(question->keywords,keywords);
question->modified = TRUE;
return(MAKEQUERY);
}
standend();
mvprintw(LINES-3,0,"Keywords:");
mvprintw(LINES-3,10,"%s",question->keywords);
refresh();
return(GETSOURCES);
}
void
result_screen(question)
Question question;
{
DocList doclist;
DocumentID current_doc;
int k;
int doc_count;
char fstr[STRINGSIZE];
char *sourcename;
doc_count = question->numresdocs;
title_display("Search Results","Items:", doc_count);
if (option_widetitles==FALSE) {
mvprintw(1,2,"# Score Source Title Lines");
sprintf(fstr,"%%03d: [%%4d] (%%15.15s) %%-%d.%ds %%5ld\n",COLS-40,COLS-40);
}
else {
mvprintw(1,2,"# Score Title Lines");
sprintf(fstr,"%%03d: [%%4d] %%-%d.%ds %%5ld\n",COLS-22,COLS-22);
}
if (question->ResultDocuments != NULL) {
k = 1;
for ( doclist = question->ResultDocuments; doclist != NULL ;
doclist = doclist->nextDoc) {
current_doc = doclist->thisDoc;
if (current_doc != NULL) {
sourcename = firstphrase(trim_junk(current_doc->doc->source));
if (NULL != strrchr(sourcename,'/')) {
sourcename = strrchr(sourcename,'/');
sourcename++;
}
if (option_widetitles==TRUE)
sprintf(select_line[k],fstr, k, current_doc->rawScore,
firstphrase(trim_junk(current_doc->doc->headline)),
current_doc->doc->numLines);
else
sprintf(select_line[k],fstr, k, current_doc->rawScore, sourcename,
firstphrase(trim_junk(current_doc->doc->headline)),
current_doc->doc->numLines);
k++;
}
}
}
selection = result_selection;
current_page = -1;
max_selection=doc_count;
page_length= MIN(LINES-6, doc_count);
selection_display(NOSELECTION);
}
programstate
result_state(question)
Question question;
{
DocList doclist;
DocumentID current_doc;
char user_key[STRINGSIZE];
char digit_str[STRINGSIZE];
int k,miss;
selection_display(selection);
digit_str[0]='\0';
while(TRUE) {
display_prompt("<space> selects, arrows move, w for keywords, s for sources, ? for help");
user_key[0]=getch();
switch(user_key[0]) {
case 'H' : show_swais_history();
state=UNKNOWN;
return(SHOWRESULTS);
case 'h' : ;
case '?' : show_search_results_help();
state=UNKNOWN;
return(SHOWRESULTS);
/* forgive me: hardwired arrow keys for vt100 since we're
not using SysV curses and bsd curses lacks key support */
case '\033' : user_key[1]=getch();
user_key[2]=getch();
user_key[3]='\0';
if (strcmp(user_key, "\033[A")) {
selection_display(selection+1);
result_selection = selection;
break;
}
if (strcmp(user_key, "\033[B")) {
selection_display(selection-1);
result_selection = selection;
break;
}
/* emacs <meta>v page previous */
if (user_key[1]=='v') {
selection_display(selection-page_length);
result_selection = selection;
break;
}
case 'o' : return(GETOPTIONS);
case ',' : ;
case 'v' : view_result_info(findDoc(question->ResultDocuments,selection-1));
state=UNKNOWN;
return(SHOWRESULTS);
case 'u' : UseWaisDocument(question, findDoc(question->ResultDocuments,selection-1));
break;
case 10 : ;
case ' ' : PipeWaisDocument(question,
findDoc(question->ResultDocuments,selection-1),
"${PAGER-more}");
if (option_pagerpause==TRUE) {
cbreak();
noecho();
PrintStatus("Press any key to continue");
getch();
}
screenstart();
state=UNKNOWN;
return(SHOWRESULTS);
case '|' : ;
case 'c' : pipe_command(question);
state=UNKNOWN;
return(SHOWRESULTS);
case 14 : ;
case 'j' : selection_display(selection+1);
result_selection = selection;
break;
case 16 : ;
case 'k' : selection_display(selection-1);
result_selection = selection;
break;
case 'q' : return(LEAVEPROGRAM);
case 's' : return(GETSOURCES);
case 'w' : return(GETKEYWORDS);
case 18 : ;
case '\f' : wrefresh(curscr);
break;
case '/' : user_key[0] = '\0';
mvprintw(LINES-3,0,"Item Name: ");
get_input_string(user_key);
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
refresh();
if (strlen(user_key)) {
k=0; miss = TRUE;
for ( doclist = question->ResultDocuments;
doclist != NULL ; doclist = doclist->nextDoc) {
current_doc = doclist->thisDoc;
k++;
if (current_doc != NULL)
if (!strncasecmp(user_key,current_doc->doc->headline,
strlen(user_key))) {
selection_display(k);
result_selection = k;
miss = FALSE;
break;
}
}
if (miss) PrintStatus("Unable to find item");
}
break;
case 'm' : mail_command(question);
state=UNKNOWN;
return(SHOWRESULTS);
case 4 : ;
case 22 : ; /* emacs ctrl-v */
case 'J' : selection_display(selection+page_length);
result_selection = selection;
break;
case 21 : ;
case 'K' : selection_display(selection-page_length);
result_selection = selection;
break;
default : if (isdigit(user_key[0])) {
digit_str[0] = user_key[0];
digit_str[1] = '\0';
mvprintw(LINES-3,0,"Item Number: ");
get_input_string(digit_str);
if (atoi(digit_str)!= 0) {
selection_display(atoi(digit_str));
result_selection = selection;
}
standend();
mvprintw(LINES-3,0," ");
clrtoeol();
}
}
}
}
void
main(argc, argv)
int argc;
char **argv;
{
Question question;
SList asource;
char msg[STRINGSIZE];
char *getenv();
char sourcename[STRINGSIZE];
int i;
if (command_name = (char*)rindex(argv[0], '/'))
command_name++;
else
command_name = argv[0];
command[0]='\0';
sdir = cdir = NULL;
keywords[0] = 0;
sourcename[0] = 0;
maxDocs = 40;
i = 1;
for(; i < argc; i++) {
if (*argv[i] == '-') {
argv[i]++;
switch (*argv[i]) {
case 'C':
i++;
if(i >= argc) {
fprintf(stderr, "Too few arguments: common source directory missing.\n");
exit(1);
}
cdir = argv[i];
break;
case 'S':
i++;
if(i >= argc) {
fprintf(stderr, "Too few arguments: user source directory missing.\n");
exit(1);
}
sdir = argv[i];
break;
case 's':
i++;
if(i >= argc) {
fprintf(stderr, "Too few arguments: source name missing.\n");
exit(1);
}
sprintf(sourcename,"%s.src", argv[i]);
break;
case 'h':
usage(argv[0]);
exit(0);
break;
default:
fprintf(stderr, "Unknown option: %s.\n", argv[i]);
exit(1);
}
}
else {
if((strlen(keywords) + strlen(argv[i]) + 1) < STRINGSIZE) {
if (strlen(keywords)) strcat(keywords, " ");
strcat(keywords, argv[i]);
}
}
}
if(sdir == NULL) {
if((sdir = getenv("WAISSOURCEDIR")) == NULL) {
sprintf(msg, "%s/wais-sources", getenv("HOME"));
sdir = s_strdup(msg);
}
}
sdir = fixdirname(sdir);
ReadSourceDirectory(sdir, TRUE);
if(cdir == NULL) {
if((cdir = getenv("WAISCOMMONSOURCEDIR")) == NULL) {
strcpy(msg, COMMON_SOURCE_DIR);
cdir = s_strdup(msg);
}
}
cdir = fixdirname(cdir);
ReadSourceDirectory(cdir, TRUE);
Refresh_sources();
strcpy(options[1].name, "widetitles");
strcpy(options[1].desc, "Show wide Item titles on Results Screen by omitting source name");
options[1].type = OPTION_BOOLEAN;
options[1].var.intptr = &option_widetitles;
options[1].update = null;
strcpy(options[2].name, "sortsources");
strcpy(options[2].desc, "Display sources sorted alphabetically rather than directory order");
options[2].type = OPTION_BOOLEAN;
options[2].var.intptr = &option_sortsources;
options[2].update = Refresh_sources;
strcpy(options[3].name, "sourcedir");
strcpy(options[3].desc, "Personal WAIS source directory containing *.src description files");
options[3].type = OPTION_STRING;
options[3].var.charptr = sdir;
options[3].update = Refresh_sources;
strcpy(options[4].name, "commondir");
strcpy(options[4].desc, "Common WAIS source directory containing *.src description files");
options[4].type = OPTION_STRING;
options[4].var.charptr = cdir;
options[4].update = Refresh_sources;
strcpy(options[5].name, "pagerpause");
strcpy(options[5].desc, "Pause after displaying a document via the external pager");
options[5].type = OPTION_BOOLEAN;
options[5].var.intptr = &option_pagerpause;
options[5].update = null;
strcpy(options[6].name, "maxitems");
strcpy(options[6].desc, "Maximum items (documents) returned in a single query");
options[6].type = OPTION_INTEGER;
options[6].var.intptr = &maxDocs;
options[6].update = null;
question = (Question)s_malloc(sizeof(_Question));
question->numsources=0;
question->modified=FALSE;
screenstart();
state = UNKNOWN;
if (sourcename[0] != 0)
for(asource = Sources; asource != NULL; asource = asource->nextSource)
if (!strcmp(sourcename, asource->thisSource->name)) {
Selected_Sources = AddSource(Selected_Sources, asource->thisSource);
question->numsources++;
question->modified=TRUE;
}
if (keywords[0]!='\0') {
strcpy(question->keywords,keywords);
question->modified = TRUE;
}
new_state = nextstate(question);
if (setjmp(main_env)!=0) {
state=UNKNOWN;
new_state=GETSOURCES;
}
while (TRUE) {
if (new_state!=state) {
if ((new_state / 10) != (state / 10)) {
clear();
switch (new_state) {
case GETSOURCES: ;
case GETKEYWORDS: ;
case MAKEQUERY: source_screen(question); break;
case SHOWRESULTS: result_screen(question); break;
case GETOPTIONS : option_screen(question); break;
case LEAVEPROGRAM: break;
}
}
else {
selection_display(NOSELECTION);
display_prompt("");
}
state = new_state;
}
switch (state) {
case MAKEQUERY:
new_state = makequery_state(question);
break;
case GETKEYWORDS: ;
new_state = keyword_state(question);
break;
case GETSOURCES:
new_state = source_state(question);
break;
case SHOWRESULTS:
new_state = result_state(question);
break;
case GETOPTIONS:
new_state = option_state(question);
break;
case LEAVEPROGRAM:
screenend();
exit(0);
}
}
}